﻿using AlibabaCloud.OpenApiClient.Models;
using AlibabaCloud.SDK.ImageSearch20201214.Models;
using AlibabaCloud.SDK.ImageSearch20201214;
using AlibabaCloud.TeaUtil.Models;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tea;

namespace ImageQueryImageApp
{
    internal static class ALHelper
    {
        public static string UploadImage(string filePath)
        {
            // Console.WriteLine("Hello World!");
            Config config = new Config();
            // 创建AK/SK参考：https://help.aliyun.com/document_detail/116401.htm
            //阿里云账号AccessKey拥有所有API的访问权限，建议您使用RAM用户进行API访问或日常运维。
            //强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里，否则可能导致AccessKey泄露，威胁您账号下所有资源的安全。
            //本示例以将AccessKey ID和AccessKey Secret保存在环境变量为例说明。您也可以根据业务需要，保存到配置文件里。
            
            config.AccessKeyId = "LTAI5tHHnDqf6Tif1i3a1BM8";
            config.AccessKeySecret = "eY1u7ezg5yCOFxOurt22Wj5kreul0N";
            config.Endpoint = "imagesearch.cn-hangzhou.aliyuncs.com";
            config.RegionId = "cn-hangzhou";
            //config.Type = "access_key";

            // 以下为内网（VPC）访问方式
            // 说明：内网（VPC）访问：仅限同区域ECS或资源的访问，
            // 例如您购买的图像搜索实例是华东2（上海），那么您的ECS或资源也必须在华东2（上海）
            // 才能通过内网VPC地址访问图搜服务，否则会调用不通，如果遇到调用不通，
            // 请先检查您的ECS或资源与图像搜索是否在同一个区域。
            // config.EndpointType = "internal";  
            // 如果是内网访问图像搜索服务，则endpointType为必填项，值统一为"internal"
            // config.Endpoint = "imagesearch-vpc.cn-shanghai.aliyuncs.com"; 
            // 为内网访问（VPC）地址，请您更换为您购买实例的区域，例如您购买实例的区域为杭州，则为"imagesearch-vpc.cn-hangzhou.aliyuncs.com"

            Client client = new Client(config);
            FileStream fs = File.OpenRead(filePath);
            AddImageAdvanceRequest request = new AddImageAdvanceRequest();
            // 必填，图片名称，最多支持 256个字符。
            // 1. ProductId + PicName唯一确定一张图片。
            // 2. 如果多次添加图片具有相同的ProductId + PicName，以最后一次添加为准，前面添加的图片将被覆盖
            var id = Guid.NewGuid().ToString();
            request.PicName = id + ".jpg";
            // 必填，商品id，最多支持 256个字符。
            // 一个商品可有多张图片。
            request.ProductId = id;
            // 必填，图像搜索实例名称。注意是实例名称不是实例ID。购买后通过上云层管控台实例信息一栏查看：https://imagesearch.console.aliyun.com/overview
            request.InstanceName = "mei2";
            // 图片内容，最多支持 4MB大小图片以及5s的传输等待时间。当前仅支持PNG、JPG、JPEG、BMP、GIF、WEBP、TIFF、PPM格式图片；
            // 对于商品、商标、通用图片搜索，图片长和宽的像素必须都大于等于100且小于等于4096；
            // 对于布料搜索，图片长和宽的像素必须都大于等于100且小于等于4096；
            // 图像中不能带有旋转信息
            request.PicContentObject = fs;
            // 选填，整数类型属性，可用于查询时过滤，查询时会返回该字段。
            //  例如不同的站点的图片/不同用户的图片，可以设置不同的IntAttr，查询时通过过滤来达到隔离的目的
          //  request.IntAttr = 99;
            // 选填，字符串类型属性，最多支持 128个字符。可用于查询时过滤，查询时会返回该字段。
           // request.StrAttr = "aliyun.com";
            // 选填，图片类目。
            // 1. 对于商品搜索：若设置类目，则以设置的为准；若不设置类目，将由系统进行类目预测，预测的类目结果可在Response中获取 。
            // 2. 对于布料、商标、通用搜索：不论是否设置类目，系统会将类目设置为88888888。
           // request.CategoryId = 5;
            // 选填，是否需要进行主体识别，默认为true。
            // 1.为true时，由系统进行主体识别，以识别的主体进行搜索，主体识别结果可在Response中获取。
            // 2. 为false时，则不进行主体识别，以整张图进行搜索。
            // 3.对于布料图片搜索，此参数会被忽略，系统会以整张图进行搜索。
            request.Crop = false;
            // 选填，图片的主体区域，格式为 x1,x2,y1,y2, 其中 x1,y1 是左上角的点，x2，y2是右下角的点。
            // 设置的region 区域不要超过图片的边界
            // 若用户设置了Region，则不论Crop参数为何值，都将以用户输入Region进行搜索。
            // 对于布料图片搜索，此参数会被忽略，系统会以整张图进行搜索。
           // request.Region = "66,333,97,356";
            RuntimeOptions runtimeObject = new RuntimeOptions();
            try
            {
                AddImageResponse response = client.AddImageAdvance(request, runtimeObject);
               return Newtonsoft.Json.JsonConvert.SerializeObject(response);
            }
            catch (TeaUnretryableException e)
            {
                return e.Message;
            }
        }

        public static string QueryImage(string filePath)
        {
            Config config = new Config();
            // 创建AK/SK参考：https://help.aliyun.com/document_detail/116401.htm
            //阿里云账号AccessKey拥有所有API的访问权限，建议您使用RAM用户进行API访问或日常运维。
            //强烈建议不要把AccessKey ID和AccessKey Secret保存到工程代码里，否则可能导致AccessKey泄露，威胁您账号下所有资源的安全。
            //本示例以将AccessKey ID和AccessKey Secret保存在环境变量为例说明。您也可以根据业务需要，保存到配置文件里。
            config.AccessKeyId = "LTAI5tHHnDqf6Tif1i3a1BM8";
            config.AccessKeySecret = "eY1u7ezg5yCOFxOurt22Wj5kreul0N";
            config.Endpoint = "imagesearch.cn-hangzhou.aliyuncs.com";
            config.RegionId = "cn-hangzhou";

            // 以下为内网（VPC）访问方式
            // 说明：内网（VPC）访问：仅限同区域ECS或资源的访问，例如您购买的图像搜索实例是华东2（上海），那么您的ECS或资源也必须在华东2（上海）才能通过内网VPC地址访问图搜服务，否则会调用不通，如果遇到调用不通，请先检查您的ECS或资源与图像搜索是否在同一个区域。
            // config.EndpointType = "internal";  // 如果是内网访问图像搜索服务，则endpointType为必填项，值统一为"internal"
            // config.Endpoint = "imagesearch-vpc.cn-shanghai.aliyuncs.com"; // 为内网访问（VPC）地址，请您更换为您购买实例的区域，例如您购买实例的区域为杭州，则为"imagesearch-vpc.cn-hangzhou.aliyuncs.com"

            Client client = new Client(config);
            FileStream fs = File.OpenRead(filePath);
            SearchImageByPicAdvanceRequest request = new SearchImageByPicAdvanceRequest();
            // 选填，商品类目。
            // 1. 对于商品搜索：若设置类目，则以设置的为准；若不设置类目，将由系统进行类目预测，预测的类目结果可在Response中获取 。
            // 2. 对于布料、商标、通用搜索：不论是否设置类目，系统会将类目设置为88888888。
            //request.CategoryId = 5;
            // 图片内容，最多支持 4MB大小图片以及5s的传输等待时间。当前仅支持PNG、JPG、JPEG、BMP、GIF、WEBP、TIFF、PPM格式图片；      
            // 对于商品、商标、通用图片搜索，图片长和宽的像素必须都大于等于100且小于等于4096；  
            // 对于布料搜索，图片长和宽的像素必须都大于等于448且小于等于4096；        
            // 图像中不能带有旋转信息
            request.PicContentObject = fs;
            // 选填，是否需要进行主体识别，默认为true。
            // 1.为true时，由系统进行主体识别，以识别的主体进行搜索，主体识别结果可在Response中获取。
            // 2. 为false时，则不进行主体识别，以整张图进行搜索。
            // 3.对于布料图片搜索，此参数会被忽略，系统会以整张图进行搜索。
            request.Crop = false;
            // 选填，过滤条件
            // int_attr支持的操作符有>、>=、<、<=、=，str_attr支持的操作符有=和!=，多个条件之支持AND和OR进行连接。
            // 示例：
            //1. 根据IntAttr过滤结果，int_attr>=100
            //2. 根据StrAttr过滤结果，str_attr!="value1"
            //3. 根据IntAttr和StrAttr联合过滤结果，int_attr=1000 AND str_attr="value1"
            //request.Filter = "int_attr=99";
            // 选填，图片的主体区域，格式为 x1,x2,y1,y2, 其中 x1,y1 是左上角的点，x2，y2是右下角的点。
            // 设置的region 区域不要超过图片的边界。
            // 若用户设置了Region，则不论Crop参数为何值，都将以用户输入Region进行搜索。
            // 3.对于布料图片搜索，此参数会被忽略，系统会以整张图进行搜索。
            //request.Region = "66,333,98,356";
            // 必填，图像搜索实例名称。注意是实例名称不是实例ID。购买后通过上云层管控台实例信息一栏查看：https://imagesearch.console.aliyun.com/overview
            request.InstanceName = "mei2";
            // 选填,若为true则响应数据根据ProductId进行返回。
            request.DistinctProductId = false;
            RuntimeOptions runtimeObject = new RuntimeOptions();
            try
            {
                SearchImageByPicResponse response = client.SearchImageByPicAdvance(request, runtimeObject);
                string result = Newtonsoft.Json.JsonConvert.SerializeObject(response);
              return result;
            }
            catch (TeaUnretryableException e)
            {
                return e.Message;
            }
        }
    }
}
